import { useUserStore } from '@/store/modules/user';
import { useSocketStore } from '@/store/modules/webSocket';
import checkShowPage from '@/utils/checkShowPage';
import { to } from 'await-to-js';
//是否需要换取token 默认第一个请求需要
const refreshToken = async (config: any): Promise<any> => {
  //清除tokne
  removeToken();
  modal.loading('正在加载...');
  //如果缓存中没有信息直接踢到登录页
  if (!getRefreshToken() || !useUserStore().userId) {
    //使用防抖 限制1秒之内没有操作跳转
    uni.$u.debounce(() => {
      tab.reLaunch(checkShowPage.loginPage);
      modal.closeLoading();
    }, 1000);
    return Promise.reject('请登录');
  }

  if (useUserStore().refreshStatus) {
    //改变状态
    useUserStore().refreshStatus = false;
    const params = {
      clientId: import.meta.env.VITE_APP_CLIENT_ID,
      tenantId: import.meta.env.VITE_APP_TENANT_ID,
      refreshToken: getRefreshToken(),
      userId: useUserStore().userId
    };
    //重新换取token
    const [err, res] = await to(uni.$u.http.post(`/auth/refreshToken`, params, { header: { isEncrypt: true } }));
    if (res) {
      setRefreshToken(res.data.refresh_token);
      setToken(res.data.access_token);
      //重新创建webSocket链接
      useSocketStore().initSocket();
      initSSE();
      useUserStore().getAllMsg();
      useUserStore().refreshStatus = true;
      modal.closeLoading();
    }
    //如果换取失败不管是怎么失败都踢回到登录页
    if (err) {
      tab.reLaunch(checkShowPage.loginPage);
      modal.closeLoading();
      useUserStore().refreshStatus = true;
      return Promise.reject(err);
    }
  }
  // 创建一个循环来不断检查状态
  while (!useUserStore().refreshStatus) {
    await new Promise<void>((resolve) => {
      // 使用watch方法监听isReady的变化
      const stopWatching = watch(
        () => useUserStore().refreshStatus,
        (newValue) => {
          if (newValue) {
            // 当isReady为true时停止监听并提交
            stopWatching();
            resolve();
          }
        });
    });
  }
  //将401的请求重新发送
  if (useUserStore().refreshStatus && getToken()) {
    const [err, res] = await to(uni.$u.http.request(config));
    if (res) {
      return res;
    }
    return Promise.reject(err);
  }
};

export default {
  refreshToken
};
